package club.banyuan.operation;

/**
 * @author sanye
 * @version 1.0
 * @date 2020/11/10 11:22 上午
 */
public class BitOperation {

  public static void main(String[] args) {

    /**
     *   &
     *
     *   |
     *
     *   ~
     *
     *   ^
     */

    int num1 = -5; //    0000 0101
    int num2 = 7; //     0000 0111
    //    0000 0101

    //  1000 0000 0000 0000 0000 0000 0000 0101
    //  1111 1111 1111 1111 1111 1111 1111 1010
    //  1111 1111 1111 1111 1111 1111 1111 1011
    //  0000 0000 0000 0000 0000 0000 0000 0111
    //  0000 0000 0000 0000 0000 0000 0000 0011

    System.out.println(num1 & num2);

    System.out.println(num1 | num2);

    System.out.println(-5 ^ 7); //同为假  异为真

    /**
     * 源码
     * 反码
     * 补码
     *  正数的源码 反码 补码 是一样的
     *  负数的源码取反得到反码(符号位不变)  反码+1=补码
     *
     *  -5^7
     *  -5     1000 0101
     *         1111 1010
     *
     *         1111 1011
     *         0000 0111
     *
     *         1111 1100  //得到的是补码  负数补码-1=反码    1111 1011  取反(符号位不变) --->1000  0100
     *
     *
     *
     */



    /**
     * 位运算
     *  >>
     *  <<
     *
     *  >>>
     *
     */

    System.out.println(7 >> 2);  //1
    /**
     * 0000 0111
     * 0000 0001
     */

    System.out.println(7 << 2);  //28

    /**
     * 0001 1100
     *
     */
    System.out.println(-7 >> 2);  //-2
    /**
     * 1000 0111
     * 1111 1000
     * 1111 1001     补码
     *
     * 1111 1110
     *
     *  1111 1101
     *
     *  1000 0010
     *
     *
     */
    System.out.println(-7 << 2);  //

    /**
     * 1000 0111
     * 1111 1000
     * 1111 1001  补码
     *
     * 1110 0100  移动之后的补码
     * 1110 0011
     * 1001 1100
     *
     */

    System.out.println(-8 >>> 3);  //536870910

    /**
     *
     *  1000 0000 0000 0000 0000 0000 0000 0111
     *  1111 1111 1111 1111 1111 1111 1111 1000
     *  1111 1111 1111 1111 1111 1111 1111 1001     //不考虑符号位   正常取到补码  然后再考虑右移动
     *
     *  0011 1111 1111 1111 1111 1111 1111 1110
     *
     *  -8>>>3
     *  1000 0000 0000 0000 0000 0000 0000 1000
     *  1111 1111 1111 1111 1111 1111 1111 0111
     *  1111 1111 1111 1111 1111 1111 1111 1000
     *
     *  0001111111111111111111111111111
     *
     *
     *  int  x=2,y=3;
     *  &=， x=x&y; ---> x&=y;
     *
     *  |=， x=x|y
     *  ^=,<<=,>>=,>>>=
     *
     */
    int x = 2, y = 3;
    //x=x&y;
    x &= y;  //x+=y;
    System.out.println(x);

    /**
     * 三元运算符
     *  数据类型  变量名 = 表达式 ？结果1 :  结果2;
     *    如果表达式成立则返回结果1,否则返回结果2  前面数据类型和返回结果有关系
     */

    int x1 = 45, y1 = 32;

    String st = x1 < y1 ? (x1 + y1 < x1 - y1 ? "哈撒给" : "还有谁") : "jvm";
    System.out.println(st);


    /**
     *
     * 课堂练习
     *   求下面结果:
     *    -8 & 8
     *    ~ 7
     *    8^9
     *    -8^9
     *    9|7
     *
     *
     */

  }
}
